<?php
/**
 * Description of imagen
 *
 */
class gdimagen {
   private $textos = array();
   private $imagenes = array();
   private $tipo = "png";
   private $im;

   

   public function __construct($ruta = "",$tipo="") {
     if (!extension_loaded("gd")) {
       throw new Exception("La libreria GD no esta habilitada");
     }
     if (!empty($ruta)) {
       $this->cargar_fondo($ruta,$tipo);
     }
   }

   /**
    * Devuelve el id del recurso de imagen
    * 
    * @return resource
    */
   public function get_handler() {
     return $this->im;
   }
   
   public function cargar_fondo($ruta,$tipo) {
     switch ($tipo) {
       case "jpg";
       case "jpeg":
         $this->im = imagecreatefromjpeg($ruta);
         break;
       case "gif":
         $this->im = imagecreatefromgif($ruta);
         break;
       case "png":
         $this->im = imagecreatefrompng($ruta);
         break;
       default:
         $this->tipo = "jpg";
         $this->im = imagecreatefromjpeg($ruta);
         break;
     }
    imagealphablending($this->im,true);
     imagesavealpha($this->im,true);
     $this->tipo = $tipo;
   }

   /**
    * Adjunta un texto a esta imagen
    *
    * @param gdtexto $texto objeto de texto
    * @param string $clave clave por la cual se va a llamar al texto
    */
   public function adjuntar_texto(gdtexto $texto,$clave ="") {
     if (!empty($clave)) {
      $this->textos[$clave] = $texto;
     } else {
       $this->textos[] = $texto;
     }
   }

   /**
    * Adjuntamos una imagen
    *
    * @param gdimagen $imagen
    * @param string $clave clave por la cual se va a encontrar la imagen
    */
   public function adjuntar_imagen(gdimagen $imagen,$x,$y,$ancho,$alto,$clave="") {
     $imagen = array("imagen" =>$imagen,
                                     "x" => $x,
                                     "y" => $y,
                                     "ancho" => $ancho,
                                     "alto" => $alto
                                    );
     if ($clave == "") {
       $this->imagenes[] = $imagen;
     } else {
       $this->imagenes[$clave] = $imagen;
     }
   }


   public function procesar() {
     if (!empty($this->textos)) {
       foreach ($this->textos as $clave => $texto) {
         $texto->procesar();
     }}
     if (!empty($this->imagenes)) {
       foreach ($this->imagenes as $clave => $imagen) {
         $imagen["imagen"]->procesar();
         imagecopy($this->im,$imagen["imagen"]->get_handler(),$imagen["x"],$imagen["y"],0,0,$imagen["ancho"],$imagen["alto"]);
       }
     }
   }
   
   /**
    * Imprime la imagen
    */
   public function mostrar() {
     header("Content-type: image/png");
     $this->procesar();
     imagepng($this->im);
     die();
   }

  /**
   * Guarda la imagen en la ruta especificada
   *
   * @param string $ruta ruta donde se va a guardar la imagen como png
   */
   public function guardar($ruta) {
     $this->procesar();
     imagepng($this->im,$ruta);
   }

}
?>